🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / service / src / commonTest / kotlin / org / meshtastic / core / service / RadioControllerImplTest.kt
Displaying Raw • Download
core/service/src/commonTest/kotlin/org/meshtastic/core/service/RadioControllerImplTest.kt 4d4070c8e1ed73a56ee2f054300a0f62e3fe2e62 (4d4070c8) Text, 77.17 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.service
Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.answering.calls
Tff7b72import T7ee787dev.mokkery.answering.returns
Tff7b72import T7ee787dev.mokkery.answering.throws
Tff7b72import T7ee787dev.mokkery.every
Tff7b72import T7ee787dev.mokkery.everySuspend
Tff7b72import T7ee787dev.mokkery.matcher.any
Tff7b72import T7ee787dev.mokkery.matcher.capture.capture
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787dev.mokkery.verify
Tff7b72import T7ee787dev.mokkery.verify.VerifyMode.Companion.atLeast
Tff7b72import T7ee787dev.mokkery.verify.VerifyMode.Companion.exactly
Tff7b72import T7ee787dev.mokkery.verifySuspend
Tff7b72import T7ee787kotlinx.coroutines.CancellationException
Tff7b72import T7ee787kotlinx.coroutines.CompletableDeferred
Tff7b72import T7ee787kotlinx.coroutines.CoroutineScope
Tff7b72import T7ee787kotlinx.coroutines.coroutineScope
Tff7b72import T7ee787kotlinx.coroutines.delay
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787kotlinx.coroutines.test.advanceTimeBy
Tff7b72import T7ee787kotlinx.coroutines.test.advanceUntilIdle
Tff7b72import T7ee787kotlinx.coroutines.test.runCurrent
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787org.meshtastic.core.common.database.DatabaseManager
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.MessageStatus
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.NodeAddress
Tff7b72import T7ee787org.meshtastic.core.model.Position
Tff7b72import T7ee787org.meshtastic.core.model.Reaction
Tff7b72import T7ee787org.meshtastic.core.repository.AwaitedSendResult
Tff7b72import T7ee787org.meshtastic.core.repository.AwaitedSendStatus
Tff7b72import T7ee787org.meshtastic.core.repository.CommandSender
Tff7b72import T7ee787org.meshtastic.core.repository.ConnectionIdentity
Tff7b72import T7ee787org.meshtastic.core.repository.EditSettingsTransactionException
Tff7b72import T7ee787org.meshtastic.core.repository.LocalNodeUnavailableException
Tff7b72import T7ee787org.meshtastic.core.repository.MeshDataHandler
Tff7b72import T7ee787org.meshtastic.core.repository.MeshLocationManager
Tff7b72import T7ee787org.meshtastic.core.repository.MeshMessageProcessor
Tff7b72import T7ee787org.meshtastic.core.repository.MeshPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.NodeManager
Tff7b72import T7ee787org.meshtastic.core.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.repository.NotificationManager
Tff7b72import T7ee787org.meshtastic.core.repository.PacketQueueRejectedException
Tff7b72import T7ee787org.meshtastic.core.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.repository.PlatformAnalytics
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioInterfaceService
Tff7b72import T7ee787org.meshtastic.core.repository.RadioSessionContext
Tff7b72import T7ee787org.meshtastic.core.repository.RadioSessionLease
Tff7b72import T7ee787org.meshtastic.core.repository.ServiceRepository
Tff7b72import T7ee787org.meshtastic.core.repository.UiPrefs
Tff7b72import T7ee787org.meshtastic.proto.AdminMessage
Tff7b72import T7ee787org.meshtastic.proto.Channel
Tff7b72import T7ee787org.meshtastic.proto.ChannelSettings
Tff7b72import T7ee787org.meshtastic.proto.ClientNotification
Tff7b72import T7ee787org.meshtastic.proto.Config
Tff7b72import T7ee787org.meshtastic.proto.HamParameters
Tff7b72import T7ee787org.meshtastic.proto.LocalConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig
Tff7b72import T7ee787org.meshtastic.proto.SharedContact
Tff7b72import T7ee787org.meshtastic.proto.User
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFailsWith
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertNull
Tff7b72import T7ee787kotlin.test.assertSame
Tff7b72import T7ee787kotlin.test.assertTrue
Tff7b72class T56d364RadioControllerImplTest Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3commandSenderTb4b4b4: Te6edf3CommandSender Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3nodeManagerTb4b4b4: Te6edf3NodeManager Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3radioInterfaceServiceTb4b4b4: Te6edf3RadioInterfaceService Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3locationManagerTb4b4b4: Te6edf3MeshLocationManager Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3dataHandlerTb4b4b4: Te6edf3MeshDataHandler Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3analyticsTb4b4b4: Te6edf3PlatformAnalytics Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3meshPrefsTb4b4b4: Te6edf3MeshPrefs Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3uiPrefsTb4b4b4: Te6edf3UiPrefs Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3databaseManagerTb4b4b4: Te6edf3DatabaseManager Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3notificationManagerTb4b4b4: Te6edf3NotificationManager Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3messageProcessorTb4b4b4: Te6edf3MeshMessageProcessor Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffcreateControllerTb4b4b4(
Te6edf3serviceRepositoryTb4b4b4: Te6edf3ServiceRepository Tff7b72= Te6edf3ServiceRepositoryImplTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3myNodeNumTb4b4b4: Tffa657Int? Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4,
Te6edf3deviceAddressTb4b4b4: Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4,
Te6edf3connectionIdentityTb4b4b4: Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionIdentity?Tff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4,
Te6edf3sessionGenerationTb4b4b4: Te6edf3MutableStateFlowTff7b72<Tffa657LongTff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(T79c0ff0LTb4b4b4)Tb4b4b4,
Te6edf3activeSessionTb4b4b4: Te6edf3MutableStateFlowTff7b72<Te6edf3RadioSessionContext?Tff7b72>Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onDeviceAddressChangedTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3scopeTb4b4b4: Te6edf3CoroutineScopeTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3RadioControllerImpl Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3myNodeNum Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3myNodeNumTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3myDeviceId Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3connectionIdentity Tb4b4b4} Te6edf3returns Te6edf3connectionIdentity
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3sessionGeneration Tb4b4b4} Te6edf3returns Te6edf3sessionGeneration
Tff7b72val Te6edf3resolvedActiveSession Tff7b72=
Te6edf3activeSession
Tff7b72?: Te6edf3MutableStateFlowTb4b4b4(Te6edf3deviceAddressTb4b4b4.Te6edf3valueTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3RadioSessionContextTb4b4b4(Te6edf3sessionGenerationTb4b4b4.Te6edf3valueTb4b4b4, Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3activeSession Tb4b4b4} Te6edf3returns Te6edf3resolvedActiveSession
Te6edf3everySuspend Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3runWhileSessionActiveTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tff7b72val Te6edf3session Tff7b72= Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff0Tff7b72] Tff7b72as Te6edf3RadioSessionContext
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3block Tff7b72= Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff1Tff7b72] Tff7b72as Tb4b4b4(Te6edf3suspend Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3resolvedActiveSessionTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3sessionTb4b4b4) Tb4b4b4{
Te6edf3blockTb4b4b4(Tb4b4b4)
Tff7b72true
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72false
Tb4b4b4}
Tb4b4b4}
Te6edf3everySuspend Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3runWithSessionLeaseTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tff7b72val Te6edf3session Tff7b72= Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff0Tff7b72] Tff7b72as Te6edf3RadioSessionContext
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3block Tff7b72= Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff1Tff7b72] Tff7b72as Tb4b4b4(Te6edf3suspend Tb4b4b4(Te6edf3RadioSessionLeaseTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3resolvedActiveSessionTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3sessionTb4b4b4) Tb4b4b4{
Te6edf3blockTb4b4b4(
Tff7b72object Tb4b4b4: T56d364RadioSessionLease Tb4b4b4{
Tff7b72override Tff7b72val Te6edf3sessionTb4b4b4: Te6edf3RadioSessionContext Tff7b72= Te6edf3session
Tff7b72override Tff7b72fun Td2a8ffisCurrentTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Te6edf3resolvedActiveSessionTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3session
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72true
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72false
Tb4b4b4}
Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3deviceAddress Tb4b4b4} Te6edf3returns Te6edf3deviceAddress
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3getDeviceAddressTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3deviceAddressTb4b4b4.Te6edf3value
Tff7b72return Te6edf3RadioControllerImplTb4b4b4(
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3nodeRepository Tff7b72= Te6edf3nodeRepositoryTb4b4b4,
Te6edf3commandSender Tff7b72= Te6edf3commandSenderTb4b4b4,
Te6edf3nodeManager Tff7b72= Te6edf3nodeManagerTb4b4b4,
Te6edf3radioInterfaceService Tff7b72= Te6edf3radioInterfaceServiceTb4b4b4,
Te6edf3locationManager Tff7b72= Te6edf3locationManagerTb4b4b4,
Te6edf3packetRepository Tff7b72= Te6edf3lazy Tb4b4b4{ Te6edf3packetRepository Tb4b4b4}Tb4b4b4,
Te6edf3dataHandler Tff7b72= Te6edf3lazy Tb4b4b4{ Te6edf3dataHandler Tb4b4b4}Tb4b4b4,
Te6edf3analytics Tff7b72= Te6edf3analyticsTb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Te6edf3uiPrefs Tff7b72= Te6edf3uiPrefsTb4b4b4,
Te6edf3databaseManager Tff7b72= Te6edf3databaseManagerTb4b4b4,
Te6edf3notificationManager Tff7b72= Te6edf3notificationManagerTb4b4b4,
Te6edf3messageProcessor Tff7b72= Te6edf3lazy Tb4b4b4{ Te6edf3messageProcessor Tb4b4b4}Tb4b4b4,
Te6edf3radioConfigRepository Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4,
Te6edf3scope Tff7b72= Te6edf3scopeTb4b4b4,
Te6edf3onDeviceAddressChanged Tff7b72= Te6edf3onDeviceAddressChangedTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72data Tff7b72class T56d364CommitBoundaryFixtureTb4b4b4(
Tff7b72val Te6edf3controllerTb4b4b4: Te6edf3RadioControllerImplTb4b4b4,
Tff7b72val Te6edf3serviceRepositoryTb4b4b4: Te6edf3ServiceRepositoryImplTb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffcreateCommitBoundaryFixtureTb4b4b4(
Te6edf3scopeTb4b4b4: Te6edf3CoroutineScopeTb4b4b4,
Te6edf3myNodeNumTb4b4b4: Tffa657Int? Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4,
Te6edf3beforeCommitDispatchTb4b4b4: Tb4b4b4(Te6edf3ServiceRepositoryImplTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3commitResultTb4b4b4: Tb4b4b4(Te6edf3ServiceRepositoryImplTb4b4b4) Tff7b72-Tff7b72> Te6edf3AwaitedSendResultTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3CommitBoundaryFixture Tb4b4b4{
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3ServiceRepositoryImplTb4b4b4(Tb4b4b4)
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3scopeTb4b4b4, Te6edf3myNodeNum Tff7b72= Te6edf3myNodeNumTb4b4b4, Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3beforeCommitDispatchTb4b4b4(Te6edf3serviceRepositoryTb4b4b4)
T8b949e// Capture after the pre-dispatch hook; commitResult then models events that happen after admission.
Tff7b72val Te6edf3departureEpochAtDispatch Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionLifecycleTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3epochsTb4b4b4.Te6edf3departures
Te6edf3commitResultTb4b4b4(Te6edf3serviceRepositoryTb4b4b4)Tb4b4b4.Te6edf3let Tb4b4b4{ Te6edf3result Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3resultTb4b4b4.Te6edf3dispatchedTb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3departureEpochAtDispatch Tff7b72= Te6edf3departureEpochAtDispatchTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3result
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3CommitBoundaryFixtureTb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3serviceRepositoryTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffstaleAddressIdentityCannotAssociateSelectedTransportTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6fftcp:newTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3identity Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionIdentity?Tff7b72>Tb4b4b4(Te6edf3ConnectionIdentityTb4b4b4(T79c0ff0LTb4b4b4, Ta5d6ff"Ta5d6ffble:oldTa5d6ff"Tb4b4b4, T79c0ff4T79c0ff2Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4, Te6edf3connectionIdentity Tff7b72= Te6edf3identityTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3associateDeviceTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffdelayedOldIdentityCannotPairWithNewAddressTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffble:oldTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3activeSession Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3RadioSessionContext?Tff7b72>Tb4b4b4(Te6edf3RadioSessionContextTb4b4b4(T79c0ff0LTb4b4b4, Ta5d6ff"Ta5d6ffble:oldTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3identity Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionIdentity?Tff7b72>Tb4b4b4(Te6edf3ConnectionIdentityTb4b4b4(T79c0ff0LTb4b4b4, Ta5d6ff"Ta5d6ffble:oldTa5d6ff"Tb4b4b4, T79c0ff4T79c0ff2Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3createControllerTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4,
Te6edf3connectionIdentity Tff7b72= Te6edf3identityTb4b4b4,
Te6edf3activeSession Tff7b72= Te6edf3activeSessionTb4b4b4,
Tb4b4b4)
Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6fftcp:newTa5d6ff"
Te6edf3activeSessionTb4b4b4.Te6edf3value Tff7b72= Te6edf3RadioSessionContextTb4b4b4(T79c0ff1LTb4b4b4, Ta5d6ff"Ta5d6fftcp:newTa5d6ff"Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3associateDeviceTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fffreshAddressBoundIdentityAssociatesExactlyOnceWithNodeFallbackTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6fftcp:selectedTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3identity Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionIdentity?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4, Te6edf3connectionIdentity Tff7b72= Te6edf3identityTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3identityTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionIdentityTb4b4b4(T79c0ff0LTb4b4b4, Ta5d6ff"Ta5d6fftcp:selectedTa5d6ff"Tb4b4b4, T79c0ff9T79c0ff9Tb4b4b4, Tff7b72nullTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3associateDeviceTb4b4b4(Ta5d6ff"Ta5d6fftcp:selectedTa5d6ff"Tb4b4b4, T79c0ff9T79c0ff9Tb4b4b4, Tff7b72nullTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsamePhysicalIdentityAssociatesEachAddressBoundSessionTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffble:oneTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3activeSession Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3RadioSessionContext?Tff7b72>Tb4b4b4(Te6edf3RadioSessionContextTb4b4b4(T79c0ff0LTb4b4b4, Ta5d6ff"Ta5d6ffble:oneTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3identity Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionIdentity?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3createControllerTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4,
Te6edf3connectionIdentity Tff7b72= Te6edf3identityTb4b4b4,
Te6edf3activeSession Tff7b72= Te6edf3activeSessionTb4b4b4,
Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3identityTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionIdentityTb4b4b4(T79c0ff0LTb4b4b4, Ta5d6ff"Ta5d6ffble:oneTa5d6ff"Tb4b4b4, T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3identityTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6fftcp:twoTa5d6ff"
Te6edf3activeSessionTb4b4b4.Te6edf3value Tff7b72= Te6edf3RadioSessionContextTb4b4b4(T79c0ff0LTb4b4b4, Ta5d6ff"Ta5d6fftcp:twoTa5d6ff"Tb4b4b4)
Te6edf3identityTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionIdentityTb4b4b4(T79c0ff0LTb4b4b4, Ta5d6ff"Ta5d6fftcp:twoTa5d6ff"Tb4b4b4, T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3associateDeviceTb4b4b4(Ta5d6ff"Ta5d6ffble:oneTa5d6ff"Tb4b4b4, T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3associateDeviceTb4b4b4(Ta5d6ff"Ta5d6fftcp:twoTa5d6ff"Tb4b4b4, T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffcollectorStartupDoesNotMissFirstSessionGenerationBoundaryTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3sessionGeneration Tff7b72= Te6edf3MutableStateFlowTb4b4b4(T79c0ff0LTb4b4b4)
Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3sessionGeneration Tff7b72= Te6edf3sessionGenerationTb4b4b4)
Te6edf3sessionGenerationTb4b4b4.Te6edf3value Tff7b72= T79c0ff1L
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3clearStaleConnectionIdentityTb4b4b4(T79c0ff1LTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fffreshIdentityPublishedBeforeBoundaryCollectorRunsIsPreservedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3sessionGeneration Tff7b72= Te6edf3MutableStateFlowTb4b4b4(T79c0ff0LTb4b4b4)
Tff7b72val Te6edf3oldIdentity Tff7b72= Te6edf3ConnectionIdentityTb4b4b4(T79c0ff0LTb4b4b4, Ta5d6ff"Ta5d6ffble:sameTa5d6ff"Tb4b4b4, T79c0ff4T79c0ff2Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3identity Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionIdentity?Tff7b72>Tb4b4b4(Te6edf3oldIdentityTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3clearStaleConnectionIdentityTb4b4b4(T79c0ff1LTb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3identityTb4b4b4.Te6edf3value Tff7b72= Te6edf3identityTb4b4b4.Te6edf3valueTff7b72?.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3sessionGeneration Tff7b72=Tff7b72= T79c0ff1L Tb4b4b4}
Tb4b4b4}
Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3connectionIdentity Tff7b72= Te6edf3identityTb4b4b4, Te6edf3sessionGeneration Tff7b72= Te6edf3sessionGenerationTb4b4b4)
Te6edf3sessionGenerationTb4b4b4.Te6edf3value Tff7b72= T79c0ff1L
Tff7b72val Te6edf3freshIdentity Tff7b72= Te6edf3oldIdentityTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3sessionGeneration Tff7b72= T79c0ff1LTb4b4b4)
Te6edf3identityTb4b4b4.Te6edf3value Tff7b72= Te6edf3freshIdentity
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3freshIdentityTb4b4b4, Te6edf3identityTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3clearStaleConnectionIdentityTb4b4b4(T79c0ff1LTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsameAddressReconnectRejectsOldGenerationUntilFreshIdentityArrivesTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffble:sameTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3sessionGeneration Tff7b72= Te6edf3MutableStateFlowTb4b4b4(T79c0ff2LTb4b4b4)
Tff7b72val Te6edf3identity Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionIdentity?Tff7b72>Tb4b4b4(Te6edf3ConnectionIdentityTb4b4b4(T79c0ff1LTb4b4b4, Ta5d6ff"Ta5d6ffble:sameTa5d6ff"Tb4b4b4, T79c0ff4T79c0ff2Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3createControllerTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4,
Te6edf3connectionIdentity Tff7b72= Te6edf3identityTb4b4b4,
Te6edf3sessionGeneration Tff7b72= Te6edf3sessionGenerationTb4b4b4,
Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3associateDeviceTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3identityTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionIdentityTb4b4b4(T79c0ff2LTb4b4b4, Ta5d6ff"Ta5d6ffble:sameTa5d6ff"Tb4b4b4, T79c0ff4T79c0ff2Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3associateDeviceTb4b4b4(Ta5d6ff"Ta5d6ffble:sameTa5d6ff"Tb4b4b4, T79c0ff4T79c0ff2Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsessionChangeCancelsInFlightAssociationTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6fftcp:selectedTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3sessionGeneration Tff7b72= Te6edf3MutableStateFlowTb4b4b4(T79c0ff1LTb4b4b4)
Tff7b72val Te6edf3activeSession Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3RadioSessionContext?Tff7b72>Tb4b4b4(Te6edf3RadioSessionContextTb4b4b4(T79c0ff1LTb4b4b4, Ta5d6ff"Ta5d6fftcp:selectedTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3identity Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionIdentity?Tff7b72>Tb4b4b4(Te6edf3ConnectionIdentityTb4b4b4(T79c0ff1LTb4b4b4, Ta5d6ff"Ta5d6fftcp:selectedTa5d6ff"Tb4b4b4, T79c0ff9T79c0ff9Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3associationStarted Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3associationCancelled Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3releaseAssociation Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3associateDeviceTb4b4b4(Ta5d6ff"Ta5d6fftcp:selectedTa5d6ff"Tb4b4b4, T79c0ff9T79c0ff9Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3associationStartedTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Tff7b72try Tb4b4b4{
Te6edf3releaseAssociationTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3cancellationTb4b4b4: Te6edf3CancellationExceptionTb4b4b4) Tb4b4b4{
Te6edf3associationCancelledTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Tff7b72throw Te6edf3cancellation
Tb4b4b4}
Tb4b4b4}
Te6edf3createControllerTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4,
Te6edf3connectionIdentity Tff7b72= Te6edf3identityTb4b4b4,
Te6edf3sessionGeneration Tff7b72= Te6edf3sessionGenerationTb4b4b4,
Te6edf3activeSession Tff7b72= Te6edf3activeSessionTb4b4b4,
Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3associationStartedTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3activeSessionTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3associationCancelledTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3releaseAssociationTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3associateDeviceTb4b4b4(Ta5d6ff"Ta5d6fftcp:selectedTa5d6ff"Tb4b4b4, T79c0ff9T79c0ff9Tb4b4b4, Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffconnectionStateAndClientNotificationDelegateToServiceRepositoryTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3ServiceRepositoryImplTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4)
Tff7b72val Te6edf3notification Tff7b72= Te6edf3ClientNotificationTb4b4b4(Tb4b4b4)
Te6edf3assertSameTb4b4b4(Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionStateTb4b4b4, Te6edf3controllerTb4b4b4.Te6edf3connectionStateTb4b4b4)
Te6edf3assertSameTb4b4b4(Te6edf3serviceRepositoryTb4b4b4.Te6edf3clientNotificationTb4b4b4, Te6edf3controllerTb4b4b4.Te6edf3clientNotificationTb4b4b4)
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectingTb4b4b4)
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setClientNotificationTb4b4b4(Te6edf3notificationTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectingTb4b4b4, Te6edf3controllerTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3assertSameTb4b4b4(Te6edf3notificationTb4b4b4, Te6edf3controllerTb4b4b4.Te6edf3clientNotificationTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3clearClientNotificationTb4b4b4(Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3serviceRepositoryTb4b4b4.Te6edf3clientNotificationTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsendMessageDelegatesToCommandSenderTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff4T79c0ff5T79c0ff6Tb4b4b4)
Tff7b72val Te6edf3packet Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3to Tff7b72= Te6edf3NodeAddressTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4, Te6edf3channel Tff7b72= T79c0ff1Tb4b4b4, Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffpingTa5d6ff"Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3sendMessageTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3packetTb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3dataHandlerTb4b4b4.Te6edf3rememberDataPacketTb4b4b4(Te6edf3packetTb4b4b4, T79c0ff4T79c0ff5T79c0ff6Tb4b4b4, Tff7b72falseTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsendMessageDoesNotPersistWhenQueueRejectsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff4T79c0ff5T79c0ff6Tb4b4b4)
Tff7b72val Te6edf3packet Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3to Tff7b72= Te6edf3NodeAddressTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4, Te6edf3channel Tff7b72= T79c0ff1Tb4b4b4, Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffpingTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3rejection Tff7b72= Te6edf3PacketQueueRejectedExceptionTb4b4b4(Ta5d6ff"Ta5d6ffData packetTa5d6ff"Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3packetTb4b4b4) Tb4b4b4} Te6edf3throws Te6edf3rejection
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3PacketQueueRejectedExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3sendMessageTb4b4b4(Te6edf3packetTb4b4b4) Tb4b4b4}
Te6edf3assertSameTb4b4b4(Te6edf3rejectionTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3dataHandlerTb4b4b4.Te6edf3rememberDataPacketTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fflocalChannelDoesNotPersistWhenQueueRejectsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff4T79c0ff5T79c0ff6Tb4b4b4)
Tff7b72val Te6edf3channel Tff7b72= Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff0Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARYTb4b4b4, Te6edf3settings Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffPrimaryTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3rejection Tff7b72= Te6edf3PacketQueueRejectedExceptionTb4b4b4(Ta5d6ff"Ta5d6ffAdmin commandTa5d6ff"Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3throws Te6edf3rejection
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3PacketQueueRejectedExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3setLocalChannelTb4b4b4(Te6edf3channelTb4b4b4) Tb4b4b4}
Te6edf3assertSameTb4b4b4(Te6edf3rejectionTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3updateChannelSettingsTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fffixedPositionPropagatesQueueRejectionTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3position Tff7b72= Te6edf3PositionTb4b4b4(Te6edf3latitude Tff7b72= T79c0ff1.0Tb4b4b4, Te6edf3longitude Tff7b72= T79c0ff2.0Tb4b4b4, Te6edf3altitude Tff7b72= T79c0ff3Tb4b4b4)
Tff7b72val Te6edf3rejection Tff7b72= Te6edf3PacketQueueRejectedExceptionTb4b4b4(Ta5d6ff"Ta5d6ffFixed positionTa5d6ff"Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3setFixedPositionTb4b4b4(T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3positionTb4b4b4) Tb4b4b4} Te6edf3throws Te6edf3rejection
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3PacketQueueRejectedExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3setFixedPositionTb4b4b4(T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3positionTb4b4b4) Tb4b4b4}
Te6edf3assertSameTb4b4b4(Te6edf3rejectionTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedPositionTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsendSharedContactCallsCommandSenderAdminAwaitTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3nodeNum Tff7b72= T79c0ff3T79c0ff2T79c0ff1
Tff7b72val Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Te6edf3NodeAddressTb4b4b4.Te6edf3numToDefaultIdTb4b4b4(Te6edf3nodeNumTb4b4b4)Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffRemote NodeTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffRNTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= Te6edf3nodeNumTb4b4b4, Te6edf3user Tff7b72= Te6edf3userTb4b4b4, Te6edf3manuallyVerified Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeRepositoryTb4b4b4.Te6edf3getNodeTb4b4b4(Te6edf3NodeAddressTb4b4b4.Te6edf3numToDefaultIdTb4b4b4(Te6edf3nodeNumTb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3node
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Tff7b72val Te6edf3result Tff7b72= Te6edf3controllerTb4b4b4.Te6edf3sendSharedContactTb4b4b4(Te6edf3nodeNumTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffrequestConfigOperationsDelegateToCommandSenderTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3getOwnerTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff1Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff1Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3getConfigTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff2Tb4b4b4, Te6edf3configType Tff7b72= T79c0ff2Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff3Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3getModuleConfigTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff3Tb4b4b4, Te6edf3moduleConfigType Tff7b72= T79c0ff4Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff5Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3getChannelTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff4Tb4b4b4, Te6edf3index Tff7b72= T79c0ff6Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff7Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3getRingtoneTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff5Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff8Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3getCannedMessagesTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff6Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff9Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3getDeviceConnectionStatusTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff7Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff1T79c0ff0Tb4b4b4)
T8b949e// All delegate to commandSender.sendAdmin
Te6edf3verifySuspendTb4b4b4(Te6edf3atLeastTb4b4b4(T79c0ff7Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffstopProvideLocationDelegatesToLocationManagerTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3stopProvideLocationTb4b4b4(Tb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3locationManagerTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetDeviceAddressSwitchesDatabaseAndTransportTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3deviceAddress Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3callOrder Tff7b72= Te6edf3mutableListOfTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3callOrder Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ffdisconnectTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3setAllowNodeDbWritesTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3callOrder Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ffwrites-offTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3callOrder Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ffprefsTa5d6ff" Tb4b4b4}
Te6edf3everySuspend Tb4b4b4{ Te6edf3messageProcessorTb4b4b4.Te6edf3clearEarlyPacketsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3callOrder Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ffbufferTa5d6ff" Tb4b4b4}
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3callOrder Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ffdatabaseTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3callOrder Tff7b72+Tff7b72= Ta5d6ff"Ta5d6fftransportTa5d6ff"
Tff7b72true
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4)
Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffdisconnectTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwrites-offTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbufferTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdatabaseTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffprefsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftransportTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3callOrderTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetDeviceAddressRestoresPreviousSelectionWhenTransportRejectsNewAddressTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6ffold:addrTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3assertFailsWithTff7b72<Te6edf3IllegalStateExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4, Te6edf3selectedAddressTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetDeviceAddressFailsClosedWhenDatabaseRollbackFailsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:newTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3throws
Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6ffdatabase rollback failedTa5d6ff"Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:newTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6fftcp:newTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Tff7b72null Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:newTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3IllegalStateExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:newTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3assertTrueTb4b4b4(
Te6edf3failureTb4b4b4.Te6edf3suppressedExceptionsTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3message Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffdatabase rollback failedTa5d6ff" Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffthe database rollback failure must be surfaced on the original switch failureTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3selectedAddressTb4b4b4.Te6edf3valueTb4b4b4, Ta5d6ff"Ta5d6fffail-closed rollback must clear the persisted selectionTa5d6ff"Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3atLeastTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3setAllowNodeDbWritesTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetDeviceAddressUsesTransportSnapshotWhenPreferenceFlowLagsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffold:preferenceTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3getDeviceAddressTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6fftcp:secondTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6fftcp:firstTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3assertFailsWithTff7b72<Te6edf3IllegalStateExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6ffold:preferenceTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4, Te6edf3selectedAddressTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetDeviceAddressRestoresPreviousSelectionWhenInitializationFailsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3everySuspend Tb4b4b4{ Te6edf3messageProcessorTb4b4b4.Te6edf3clearEarlyPacketsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tff7b72throw Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6ffforced initialization failureTa5d6ff"Tb4b4b4)
Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6ffold:addrTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3assertFailsWithTff7b72<Te6edf3IllegalStateExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4, Te6edf3selectedAddressTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffconcurrentDeviceSelectionsAreSerializedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffold:addrTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4)
Tff7b72val Te6edf3firstSwitchStarted Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3releaseFirstSwitch Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3firstSwitchStartedTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3releaseFirstSwitchTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3everySuspend Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6fftcp:firstTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Te6edf3selectedAddressTb4b4b4.Te6edf3value Tff7b72= Ta5d6ff"Ta5d6fftcp:secondTa5d6ff" Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Tff7b72val Te6edf3first Tff7b72= Te6edf3launch Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3firstSwitchStartedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3second Tff7b72= Te6edf3launch Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3releaseFirstSwitchTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3firstTb4b4b4.Te6edf3joinTb4b4b4(Tb4b4b4)
Te6edf3secondTb4b4b4.Te6edf3joinTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:firstTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6fftcp:secondTa5d6ff"Tb4b4b4, Te6edf3selectedAddressTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetDeviceAddressSkipsSwitchWhenAddressUnchangedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3deviceAddress Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3getDeviceAddressTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3controllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4)
Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
T8b949e// Database work is skipped, while both selectors are converged on the requested address.
Te6edf3verify Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetDeviceAddressDoesNotPersistOrReportSuccessWhenPreferenceMatchesButTransportRejectsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4)
Tff7b72var Te6edf3successCallbacks Tff7b72= T79c0ff0
Tff7b72val Te6edf3controller Tff7b72=
Te6edf3createControllerTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3selectedAddressTb4b4b4,
Te6edf3onDeviceAddressChanged Tff7b72= Tb4b4b4{ Te6edf3successCallbacks Tff7b72+Tff7b72= T79c0ff1 Tb4b4b4}Tb4b4b4,
Tb4b4b4)
T8b949e// The persisted selection matches, but the transport has no matching active selection and rejects the request.
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3getDeviceAddressTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72null
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3assertFailsWithTff7b72<Te6edf3IllegalStateExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4, Te6edf3selectedAddressTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3successCallbacksTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6fftcp:192.168.1.1Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3databaseManagerTb4b4b4.Te6edf3switchActiveDatabaseTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsendReactionPersistsToDatabaseTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!abcd1234Ta5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTestTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffTTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Te6edf3user Tff7b72= Te6edf3userTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3mapOfTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4 Te6edf3to Te6edf3nodeTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3getMyIdTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Ta5d6ff"Ta5d6ff!abcd1234Ta5d6ff"
T8b949e// Production CommandSenderImpl.sendData stamps QUEUED on successful queue admission. DataPacket.status is
T8b949e// nullable but defaults to UNKNOWN, so the default value does not exercise the controller's null fallback.
T8b949e// Mirror the production stamp here so this assertion exercises the realistic happy-path contract; the explicit
T8b949e// ERROR-stamping path is covered by sendReactionPersistsStatusStampedByCommandSender.
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff0Tff7b72] Tff7b72as Te6edf3DataPacketTb4b4b4)Tb4b4b4.Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUED
Tb4b4b4}
Tff7b72val Te6edf3reactions Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3ReactionTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3insertReactionTb4b4b4(Te6edf3captureTb4b4b4(Te6edf3reactionsTb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3controllerTb4b4b4.Te6edf3sendReactionTb4b4b4(Te6edf3emoji Tff7b72= Ta5d6ff"Ta5d6ff👍Ta5d6ff"Tb4b4b4, Te6edf3replyId Tff7b72= T79c0ff4T79c0ff2Tb4b4b4, Te6edf3contactKey Tff7b72= Ta5d6ff"Ta5d6ff0!dest5678Ta5d6ff"Tb4b4b4)
T8b949e// Reaction must be persisted (not fire-and-forget) with the queue-admission QUEUED status.
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3reactionsTb4b4b4.Te6edf3singleTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsendReactionDoesNotPersistWhenQueueRejectsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!abcd1234Ta5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTestTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffTTa5d6ff"Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3mapOfTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4 Te6edf3to Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Te6edf3user Tff7b72= Te6edf3userTb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3getMyIdTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Ta5d6ff"Ta5d6ff!abcd1234Ta5d6ff"
Tff7b72val Te6edf3rejection Tff7b72= Te6edf3PacketQueueRejectedExceptionTb4b4b4(Ta5d6ff"Ta5d6ffReactionTa5d6ff"Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff0Tff7b72] Tff7b72as Te6edf3DataPacketTb4b4b4)Tb4b4b4.Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3ERROR
Tff7b72throw Te6edf3rejection
Tb4b4b4}
Tff7b72val Te6edf3failure Tff7b72=
Te6edf3assertFailsWithTff7b72<Te6edf3PacketQueueRejectedExceptionTff7b72> Tb4b4b4{
Te6edf3controllerTb4b4b4.Te6edf3sendReactionTb4b4b4(Te6edf3emoji Tff7b72= Ta5d6ff"Ta5d6ff👍Ta5d6ff"Tb4b4b4, Te6edf3replyId Tff7b72= T79c0ff4T79c0ff2Tb4b4b4, Te6edf3contactKey Tff7b72= Ta5d6ff"Ta5d6ff0!dest5678Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Te6edf3assertSameTb4b4b4(Te6edf3rejectionTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3insertReactionTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsendReactionFallsBackToQueuedWhenSenderLeavesStatusNullTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!abcd1234Ta5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTestTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffTTa5d6ff"Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3mapOfTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4 Te6edf3to Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Te6edf3user Tff7b72= Te6edf3userTb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3getMyIdTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Ta5d6ff"Ta5d6ff!abcd1234Ta5d6ff"
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls Tb4b4b4{ Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff0Tff7b72] Tff7b72as Te6edf3DataPacketTb4b4b4)Tb4b4b4.Te6edf3status Tff7b72= Tff7b72null Tb4b4b4}
Tff7b72val Te6edf3reactions Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3ReactionTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3insertReactionTb4b4b4(Te6edf3captureTb4b4b4(Te6edf3reactionsTb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3controllerTb4b4b4.Te6edf3sendReactionTb4b4b4(Te6edf3emoji Tff7b72= Ta5d6ff"Ta5d6ff👍Ta5d6ff"Tb4b4b4, Te6edf3replyId Tff7b72= T79c0ff4T79c0ff2Tb4b4b4, Te6edf3contactKey Tff7b72= Ta5d6ff"Ta5d6ff0!dest5678Ta5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3reactionsTb4b4b4.Te6edf3singleTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetFavoriteSendsAdminAndUpdatesStateTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff9T79c0ff9Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!node99Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3isFavorite Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3mapOfTb4b4b4(T79c0ff9T79c0ff9 Te6edf3to Te6edf3nodeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3setFavoriteTb4b4b4(T79c0ff9T79c0ff9Tb4b4b4, Te6edf3favorite Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3updateNodeTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetFavoriteIsNoOpWhenAlreadyInRequestedStateTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff9T79c0ff9Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!node99Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3isFavorite Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3mapOfTb4b4b4(T79c0ff9T79c0ff9 Te6edf3to Te6edf3nodeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3setFavoriteTb4b4b4(T79c0ff9T79c0ff9Tb4b4b4, Te6edf3favorite Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3updateNodeTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetIgnoredSendsAdminUpdatesStateAndFiltersPacketsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff9T79c0ff9Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!node99Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3isIgnored Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3mapOfTb4b4b4(T79c0ff9T79c0ff9 Te6edf3to Te6edf3nodeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3setIgnoredTb4b4b4(T79c0ff9T79c0ff9Tb4b4b4, Te6edf3ignored Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3updateNodeTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3updateFilteredBySenderTb4b4b4(Ta5d6ff"Ta5d6ff!node99Ta5d6ff"Tb4b4b4, Tff7b72trueTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fftoggleMutedSendsAdminAndUpdatesStateTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff9T79c0ff9Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!node99Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3isMuted Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3mapOfTb4b4b4(T79c0ff9T79c0ff9 Te6edf3to Te6edf3nodeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3toggleMutedTb4b4b4(T79c0ff9T79c0ff9Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3updateNodeTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffnodeManagementReturnsEarlyWhenMyNodeNumIsNullTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= Tff7b72nullTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3setFavoriteTb4b4b4(T79c0ff9T79c0ff9Tb4b4b4, Te6edf3favorite Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3setIgnoredTb4b4b4(T79c0ff9T79c0ff9Tb4b4b4, Te6edf3ignored Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3toggleMutedTb4b4b4(T79c0ff9T79c0ff9Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffremoveByNodenumAlwaysRemovesLocallyAndSendsAdminWhenConnectedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3removeByNodenumTb4b4b4(Te6edf3packetId Tff7b72= T79c0ff1Tb4b4b4, Te6edf3nodeNum Tff7b72= T79c0ff5T79c0ff5Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3removeByNodenumTb4b4b4(T79c0ff5T79c0ff5Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffremoveByNodenumRetainsLocalRemovalWhenAdminQueueRejectsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3throws
Te6edf3PacketQueueRejectedExceptionTb4b4b4(Ta5d6ff"Ta5d6ffRemove nodeTa5d6ff"Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3removeByNodenumTb4b4b4(Te6edf3packetId Tff7b72= T79c0ff1Tb4b4b4, Te6edf3nodeNum Tff7b72= T79c0ff5T79c0ff5Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3removeByNodenumTb4b4b4(T79c0ff5T79c0ff5Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffremoveByNodenumRemovesLocallyEvenWhenDisconnectedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= Tff7b72nullTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3removeByNodenumTb4b4b4(Te6edf3packetId Tff7b72= T79c0ff1Tb4b4b4, Te6edf3nodeNum Tff7b72= T79c0ff5T79c0ff5Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3removeByNodenumTb4b4b4(T79c0ff5T79c0ff5Tb4b4b4) Tb4b4b4}
T8b949e// No admin message sent when disconnected
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffrebootSendsAdminMessageWithDelayTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3rebootTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff1Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff7Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffshutdownSendsAdminMessageTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3shutdownTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff1Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff8Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fffactoryResetSendsAdminMessageTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3factoryResetTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff1Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff9Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffnodedbResetSendsAdminMessageTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3nodedbResetTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff1Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff1T79c0ff0Tb4b4b4, Te6edf3preserveFavorites Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetTimeSendsAdminMessageWithCurrentEpochSecondsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Tff7b72var Te6edf3sentMessageTb4b4b4: Te6edf3AdminMessage? Tff7b72= Tff7b72null
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Te6edf3sentMessage Tff7b72= Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4)Tb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3setTimeTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff1Tb4b4b4, Te6edf3packetId Tff7b72= T79c0ff1T79c0ff1Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
T8b949e// The phone's current time is sent; assert it is populated and a plausible recent epoch (after 2020).
Tff7b72val Te6edf3setTime Tff7b72= Te6edf3sentMessageTff7b72?.Te6edf3set_time_only
Te6edf3assertTrueTb4b4b4(Te6edf3setTime Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3setTime Tff7b72> T79c0ff1Te6edf3_577_836_800Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffrefreshMetadataSendsAdminWithWantResponseTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3refreshMetadataTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff1T79c0ff0T79c0ff1Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffdispatchedSendResultTb4b4b4(Te6edf3statusTb4b4b4: Te6edf3AwaitedSendStatusTb4b4b4, Te6edf3departureEpochAtDispatchTb4b4b4: Tffa657Long Tff7b72= T79c0ff0LTb4b4b4) Tff7b72=
Te6edf3AwaitedSendResultTb4b4b4(Te6edf3statusTb4b4b4, Te6edf3departureEpochAtDispatch Tff7b72= Te6edf3departureEpochAtDispatchTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffacceptedSendResultTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4)
Tf0883e@Test
Tff7b72fun Td2a8ffeditLocalSettingsChannelWritesDoNotMirrorToLocalCacheTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setChannelTb4b4b4(Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff0Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARYTb4b4b4, Te6edf3settings Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffATa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3setChannelTb4b4b4(Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff1Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3SECONDARYTb4b4b4, Te6edf3settings Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffBTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
T8b949e// Exactly four packets: awaited begin + 2 channel writes + awaited commit. The tight count also catches a
T8b949e// duplicated boundary or an accidental double-write per channel.
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
T8b949e// A transactional channel write must not eagerly mirror to the local cache like a one-shot setRemoteChannel.
T8b949e// The batch operation knows the complete target set and must reconcile it after the transaction; per-slot
T8b949e// mirroring here could expose a partial cache when a later write or commit fails.
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3updateChannelSettingsTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsAwaitsBoundariesAroundOrderedWritesTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3sentMessages Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3AdminMessageTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Te6edf3sentMessages Tff7b72+Tff7b72= Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4)Tb4b4b4(Tb4b4b4)
Tff7b72true
Tb4b4b4}
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Te6edf3sentMessages Tff7b72+Tff7b72= Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4)Tb4b4b4(Tb4b4b4)
Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Te6edf3sentMessages Tff7b72+Tff7b72= Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4)Tb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setChannelTb4b4b4(Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff0Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARYTb4b4b4, Te6edf3settings Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffPrimaryTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3setChannelTb4b4b4(
Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff1Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3SECONDARYTb4b4b4, Te6edf3settings Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffSecondaryTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(T79c0ff4Tb4b4b4, Te6edf3sentMessagesTb4b4b4.Te6edf3sizeTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Tff7b72trueTb4b4b4, Te6edf3sentMessagesTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3begin_edit_settingsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3sentMessagesTff7b72[T79c0ff1Tff7b72]Tb4b4b4.Te6edf3set_channelTff7b72?.Te6edf3indexTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3sentMessagesTff7b72[T79c0ff2Tff7b72]Tb4b4b4.Te6edf3set_channelTff7b72?.Te6edf3indexTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Tff7b72trueTb4b4b4, Te6edf3sentMessagesTff7b72[T79c0ff3Tff7b72]Tb4b4b4.Te6edf3commit_edit_settingsTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsAppliesStagedLocalProjectionsOnlyAfterCommitAcceptanceTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3commitStarted Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3releaseCommit Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!000004d2Ta5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffCommitted ownerTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3device Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3moduleConfig Tff7b72= Te6edf3ModuleConfigTb4b4b4(Te6edf3statusmessage Tff7b72= Te6edf3ModuleConfigTb4b4b4.Te6edf3StatusMessageConfigTb4b4b4(Te6edf3node_status Tff7b72= Ta5d6ff"Ta5d6ffReadyTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3fixedPosition Tff7b72= Te6edf3PositionTb4b4b4(Te6edf3latitude Tff7b72= T79c0ff4T79c0ff7.6Tb4b4b4, Te6edf3longitude Tff7b72= Tff7b72-T79c0ff1T79c0ff2T79c0ff2.3Tb4b4b4, Te6edf3altitude Tff7b72= T79c0ff4T79c0ff2Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3commitStartedTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3releaseCommitTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3editJob Tff7b72= Te6edf3launch Tb4b4b4{
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setOwnerTb4b4b4(Te6edf3userTb4b4b4)
Te6edf3setConfigTb4b4b4(Te6edf3configTb4b4b4)
Te6edf3setModuleConfigTb4b4b4(Te6edf3moduleConfigTb4b4b4)
Te6edf3setFixedPositionTb4b4b4(Te6edf3fixedPositionTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3commitStartedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3updateNodeStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedPositionTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalConfigTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalModuleConfigTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3releaseCommitTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3editJobTb4b4b4.Te6edf3joinTb4b4b4(Tb4b4b4)
Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Te6edf3userTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3updateNodeStatusTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Ta5d6ff"Ta5d6ffReadyTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedPositionTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalConfigTb4b4b4(Te6edf3configTb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalModuleConfigTb4b4b4(Te6edf3moduleConfigTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsRetainsInterleavedStagedLocalProjectionsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!000004d2Ta5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffConcurrent ownerTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3device Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3moduleConfig Tff7b72= Te6edf3ModuleConfigTb4b4b4(Te6edf3statusmessage Tff7b72= Te6edf3ModuleConfigTb4b4b4.Te6edf3StatusMessageConfigTb4b4b4(Te6edf3node_status Tff7b72= Ta5d6ff"Ta5d6ffReadyTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3coroutineScope Tb4b4b4{
Te6edf3launch Tb4b4b4{ Te6edf3setOwnerTb4b4b4(Te6edf3userTb4b4b4) Tb4b4b4}
Te6edf3launch Tb4b4b4{ Te6edf3setConfigTb4b4b4(Te6edf3configTb4b4b4) Tb4b4b4}
Te6edf3launch Tb4b4b4{ Te6edf3setModuleConfigTb4b4b4(Te6edf3moduleConfigTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Te6edf3userTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3updateNodeStatusTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Ta5d6ff"Ta5d6ffReadyTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalConfigTb4b4b4(Te6edf3configTb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalModuleConfigTb4b4b4(Te6edf3moduleConfigTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsDoesNotProjectZeroPositionWhenRemovingFixedPositionTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3writes Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3AdminMessageTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Te6edf3writes Tff7b72+Tff7b72= Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4)Tb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setFixedPositionTb4b4b4(Te6edf3PositionTb4b4b4(Te6edf3latitude Tff7b72= T79c0ff0.0Tb4b4b4, Te6edf3longitude Tff7b72= T79c0ff0.0Tb4b4b4, Te6edf3altitude Tff7b72= T79c0ff0Tb4b4b4, Te6edf3time Tff7b72= T79c0ff1Tb4b4b4, Te6edf3satellitesInView Tff7b72= T79c0ff9Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Tff7b72trueTb4b4b4, Te6edf3writesTb4b4b4.Te6edf3singleTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3remove_fixed_positionTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedPositionTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsRejectsFixedPositionWriteBeforeDeviceMutationWhenLocalNodeIsUnavailableTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= Tff7b72nullTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Te6edf3assertFailsWithTff7b72<Te6edf3LocalNodeUnavailableExceptionTff7b72> Tb4b4b4{
Te6edf3controllerTb4b4b4.Te6edf3editSettingsTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff9T79c0ff9Tb4b4b4) Tb4b4b4{
Te6edf3setFixedPositionTb4b4b4(Te6edf3PositionTb4b4b4(Te6edf3latitude Tff7b72= T79c0ff4T79c0ff7.6Tb4b4b4, Te6edf3longitude Tff7b72= Tff7b72-T79c0ff1T79c0ff2T79c0ff2.3Tb4b4b4, Te6edf3altitude Tff7b72= T79c0ff4T79c0ff2Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedPositionTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsContinuesLocalProjectionReconciliationAfterProjectionFailureTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!000004d2Ta5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffCommitted ownerTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3device Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3throws
Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6ffprojection failedTa5d6ff"Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setOwnerTb4b4b4(Te6edf3userTb4b4b4)
Te6edf3setConfigTb4b4b4(Te6edf3configTb4b4b4)
Tb4b4b4}
Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalConfigTb4b4b4(Te6edf3configTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsDiscardsStagedLocalProjectionsWhenCommitFailsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3RADIO_REJECTEDTb4b4b4)
Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setOwnerTb4b4b4(Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!000004d2Ta5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffUncommitted ownerTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3setConfigTb4b4b4(Te6edf3ConfigTb4b4b4(Te6edf3device Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3setModuleConfigTb4b4b4(Te6edf3ModuleConfigTb4b4b4(Te6edf3statusmessage Tff7b72= Te6edf3ModuleConfigTb4b4b4.Te6edf3StatusMessageConfigTb4b4b4(Te6edf3node_status Tff7b72= Ta5d6ff"Ta5d6ffStaleTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3setFixedPositionTb4b4b4(Te6edf3PositionTb4b4b4(Te6edf3latitude Tff7b72= T79c0ff1.0Tb4b4b4, Te6edf3longitude Tff7b72= T79c0ff2.0Tb4b4b4, Te6edf3altitude Tff7b72= T79c0ff3Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3updateNodeStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedPositionTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalConfigTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalModuleConfigTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsDiscardsStagedLocalProjectionsWhenBlockFailsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3blockFailure Tff7b72= Te6edf3IllegalArgumentExceptionTb4b4b4(Ta5d6ff"Ta5d6fftransaction failed after writesTa5d6ff"Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3failure Tff7b72=
Te6edf3assertFailsWithTff7b72<Te6edf3IllegalArgumentExceptionTff7b72> Tb4b4b4{
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setOwnerTb4b4b4(Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!000004d2Ta5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffRolled back ownerTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3setConfigTb4b4b4(Te6edf3ConfigTb4b4b4(Te6edf3device Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3setModuleConfigTb4b4b4(
Te6edf3ModuleConfigTb4b4b4(Te6edf3statusmessage Tff7b72= Te6edf3ModuleConfigTb4b4b4.Te6edf3StatusMessageConfigTb4b4b4(Te6edf3node_status Tff7b72= Ta5d6ff"Ta5d6ffRolled backTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3setFixedPositionTb4b4b4(Te6edf3PositionTb4b4b4(Te6edf3latitude Tff7b72= T79c0ff4.0Tb4b4b4, Te6edf3longitude Tff7b72= T79c0ff5.0Tb4b4b4, Te6edf3altitude Tff7b72= T79c0ff6Tb4b4b4)Tb4b4b4)
Tff7b72throw Te6edf3blockFailure
Tb4b4b4}
Tb4b4b4}
Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
Te6edf3assertSameTb4b4b4(Te6edf3blockFailureTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3updateNodeStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedPositionTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalConfigTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setLocalModuleConfigTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsRejectsFailedBeginBeforeRunningWritesTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Tff7b72var Te6edf3blockRan Tff7b72= Tff7b72false
Tff7b72val Te6edf3failure Tff7b72=
Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{ Te6edf3blockRan Tff7b72= Tff7b72true Tb4b4b4} Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3editSettingsBoundaryFailureMessageTb4b4b4(Ta5d6ff"Ta5d6ffbeginTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3failureTb4b4b4.Te6edf3messageTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3blockRanTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsReportsFailedCommitAfterOrderedWritesTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3RADIO_REJECTEDTb4b4b4)
Tff7b72val Te6edf3failure Tff7b72=
Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setChannelTb4b4b4(
Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff0Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARYTb4b4b4, Te6edf3settings Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffPrimaryTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(
Te6edf3editSettingsCommitFailureMessageTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3RADIO_REJECTEDTb4b4b4, Te6edf3dispatched Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3failureTb4b4b4.Te6edf3messageTb4b4b4,
Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsCommitsAfterWriteFailureAndRethrowsOriginalTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3writeFailure Tff7b72= Te6edf3IllegalArgumentExceptionTb4b4b4(Ta5d6ff"Ta5d6ffsettings write failedTa5d6ff"Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3throws Te6edf3writeFailure
Tff7b72val Te6edf3failure Tff7b72=
Te6edf3assertFailsWithTff7b72<Te6edf3IllegalArgumentExceptionTff7b72> Tb4b4b4{
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setChannelTb4b4b4(Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff0Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARYTb4b4b4, Te6edf3settings Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffATa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3assertSameTb4b4b4(Te6edf3writeFailureTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3failureTb4b4b4.Te6edf3suppressedExceptionsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsSuppressesCommitFailureOnBlockFailureTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3RADIO_REJECTEDTb4b4b4)
Tff7b72val Te6edf3blockFailure Tff7b72= Te6edf3IllegalArgumentExceptionTb4b4b4(Ta5d6ff"Ta5d6ffsettings write failedTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3IllegalArgumentExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{ Tff7b72throw Te6edf3blockFailure Tb4b4b4} Tb4b4b4}
Te6edf3assertSameTb4b4b4(Te6edf3blockFailureTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3listOfTb4b4b4(Te6edf3editSettingsCommitFailureMessageTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3RADIO_REJECTEDTb4b4b4, Te6edf3dispatched Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3failureTb4b4b4.Te6edf3suppressedExceptionsTb4b4b4.Te6edf3mapTb4b4b4(Te6edf3ThrowableTff7b72::Te6edf3messageTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsSuppressesDistinctCommitFailureWithSameSignatureTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3throws
Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6ffsame failureTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3blockFailure Tff7b72= Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6ffsame failureTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3IllegalStateExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{ Tff7b72throw Te6edf3blockFailure Tb4b4b4} Tb4b4b4}
Te6edf3assertSameTb4b4b4(Te6edf3blockFailureTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffsame failureTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3failureTb4b4b4.Te6edf3suppressedExceptionsTb4b4b4.Te6edf3mapTb4b4b4(Te6edf3ThrowableTff7b72::Te6edf3messageTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsDoesNotSuppressCommitFailureCausedByBlockFailureTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3blockFailure Tff7b72= Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6ffsettings write failedTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3recoveredBlockFailure Tff7b72=
Te6edf3IllegalStateExceptionTb4b4b4(
Ta5d6ff"Ta5d6ffouter coroutine recovery wrapperTa5d6ff"Tb4b4b4,
Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6ffrecovered settings write failureTa5d6ff"Tb4b4b4, Te6edf3blockFailureTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3throws Te6edf3recoveredBlockFailure
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3IllegalStateExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{ Tff7b72throw Te6edf3blockFailure Tb4b4b4} Tb4b4b4}
Te6edf3assertSameTb4b4b4(Te6edf3blockFailureTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3failureTb4b4b4.Te6edf3suppressedExceptionsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsAcceptsDispatchedCommitWhenLocalTransportDepartsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3serviceRepository Tff7b72-Tff7b72>
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsWaitsForCanonicalDepartureAfterTransportStopsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72var Te6edf3stateAtCommitReturnTb4b4b4: Te6edf3ConnectionState? Tff7b72= Tff7b72null
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3serviceRepositoryTb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3serviceRepository Tff7b72-Tff7b72>
Te6edf3backgroundScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4) Tb4b4b4}
Te6edf3stateAtCommitReturn Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3value
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4, Te6edf3stateAtCommitReturnTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4, Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsAcceptsCapturedDisconnectAfterFastReconnectTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3serviceRepositoryTb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3serviceRepository Tff7b72-Tff7b72>
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectingTb4b4b4)
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4, Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsRejectsTransportStopBeforeCommitTransmissionTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3serviceRepository Tff7b72-Tff7b72>
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3AwaitedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4} Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(
Te6edf3editSettingsCommitFailureMessageTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3dispatched Tff7b72= Tff7b72falseTb4b4b4)Tb4b4b4,
Te6edf3failureTb4b4b4.Te6edf3messageTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsRejectsTransportStopWithoutObservedDepartureTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4} Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(
Te6edf3editSettingsCommitFailureMessageTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3dispatched Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3failureTb4b4b4.Te6edf3messageTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsDoesNotAcceptDepartureFromQueuedPredecessorAsCommitEvidenceTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4,
Te6edf3beforeCommitDispatch Tff7b72= Tb4b4b4{ Te6edf3repository Tff7b72-Tff7b72>
Te6edf3repositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4} Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(
Te6edf3editSettingsCommitFailureMessageTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3dispatched Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3failureTb4b4b4.Te6edf3messageTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsAcceptsTimedOutCommitWhenLocalTransportDepartsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3serviceRepository Tff7b72-Tff7b72>
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TIMED_OUTTb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsRejectsTimedOutCommitWithoutObservedDepartureTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TIMED_OUTTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4} Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3editSettingsCommitFailureMessageTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TIMED_OUTTb4b4b4, Te6edf3dispatched Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4, Te6edf3failureTb4b4b4.Te6edf3messageTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsAcceptsDeviceSleepAsPostDispatchDepartureTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72var Te6edf3departuresAtCommit Tff7b72= T79c0ff0L
Tff7b72var Te6edf3departuresAfterSleep Tff7b72= T79c0ff0L
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3serviceRepository Tff7b72-Tff7b72>
Te6edf3departuresAtCommit Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionLifecycleTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3epochsTb4b4b4.Te6edf3departures
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DeviceSleepTb4b4b4)
Te6edf3departuresAfterSleep Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionLifecycleTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3epochsTb4b4b4.Te6edf3departures
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4}
Te6edf3assertTrueTb4b4b4(
Te6edf3departuresAfterSleep Tff7b72> Te6edf3departuresAtCommitTb4b4b4,
Ta5d6ff"Ta5d6ffDeviceSleep must publish a departure before the commit result is evaluatedTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsAcceptsConnectingAsPostDispatchDepartureTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3serviceRepositoryTb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3repository Tff7b72-Tff7b72>
Te6edf3repositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectingTb4b4b4)
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectingTb4b4b4, Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsAcceptsDepartureThatArrivesWithinCommitDepartureTimeoutTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3serviceRepositoryTb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3repository Tff7b72-Tff7b72>
Te6edf3backgroundScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3delayTb4b4b4(Te6edf3COMMIT_DEPARTURE_TIMEOUTTb4b4b4.Te6edf3inWholeMilliseconds Tff7b72/ T79c0ff2Tb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Tb4b4b4}
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4, Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsRejectsDepartureThatArrivesAfterCommitDepartureTimeoutTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3serviceRepositoryTb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3repository Tff7b72-Tff7b72>
Te6edf3backgroundScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3delayTb4b4b4(Te6edf3COMMIT_DEPARTURE_TIMEOUTTb4b4b4.Te6edf3inWholeMilliseconds Tff7b72+ T79c0ff1Tb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Tb4b4b4}
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4} Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(
Te6edf3editSettingsCommitFailureMessageTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3dispatched Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3failureTb4b4b4.Te6edf3messageTb4b4b4,
Tb4b4b4)
Te6edf3advanceTimeByTb4b4b4(Te6edf3COMMIT_DEPARTURE_TIMEOUTTb4b4b4.Te6edf3inWholeMilliseconds Tff7b72+ T79c0ff1Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4, Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsDoesNotTreatLocalDepartureAsRemoteCommitAcceptanceTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4) Tb4b4b4{ Te6edf3serviceRepository Tff7b72-Tff7b72>
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editSettingsTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff5T79c0ff6T79c0ff7T79c0ff8Tb4b4b4) Tb4b4b4{Tb4b4b4} Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(
Te6edf3editSettingsCommitFailureMessageTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3dispatched Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3failureTb4b4b4.Te6edf3messageTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsDoesNotTreatDestinationZeroAsLocalWhenNodeIdentityIsUnknownTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3controllerTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72=
Te6edf3createCommitBoundaryFixtureTb4b4b4(Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{ Te6edf3serviceRepository Tff7b72-Tff7b72>
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3dispatchedSendResultTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3failure Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3EditSettingsTransactionExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editSettingsTb4b4b4(Te6edf3destNum Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{Tb4b4b4} Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(
Te6edf3editSettingsCommitFailureMessageTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3dispatched Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3failureTb4b4b4.Te6edf3messageTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditLocalSettingsFailsBeforeBeginWhenNodeIdentityIsUnknownTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= Tff7b72nullTb4b4b4)
Te6edf3assertFailsWithTff7b72<Te6edf3LocalNodeUnavailableExceptionTff7b72> Tb4b4b4{ Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{Tb4b4b4} Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffeditSettingsCommitsWhenCallerIsCancelledTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3acceptedSendResultTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3blockStarted Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3keepBlockOpen Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3job Tff7b72= Te6edf3launch Tb4b4b4{
Te6edf3controllerTb4b4b4.Te6edf3editLocalSettings Tb4b4b4{
Te6edf3setOwnerTb4b4b4(Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!000004d2Ta5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffCancelled ownerTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3blockStartedTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3keepBlockOpenTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3blockStartedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3jobTb4b4b4.Te6edf3cancelTb4b4b4(Te6edf3CancellationExceptionTb4b4b4(Ta5d6ff"Ta5d6ffcancel settings transactionTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3jobTb4b4b4.Te6edf3joinTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3jobTb4b4b4.Te6edf3isCancelledTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminAwaitResultTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffimportContactSendsAdminAndUpdatesNodeManagerTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
T8b949e// A QR-scanned contact arrives with manually_verified = false (proto default).
Tff7b72val Te6edf3contact Tff7b72= Te6edf3SharedContactTb4b4b4(Te6edf3node_num Tff7b72= T79c0ff4T79c0ff2Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!0000002aTa5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTestTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72var Te6edf3sentMessageTb4b4b4: Te6edf3AdminMessage? Tff7b72= Tff7b72null
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Te6edf3sentMessage Tff7b72= Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4)Tb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3importContactTb4b4b4(Te6edf3contactTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
T8b949e// The verification state encoded by the sharer is honored as-is, not forced to true.
Te6edf3assertEqualsTb4b4b4(Tff7b72falseTb4b4b4, Te6edf3sentMessageTff7b72?.Te6edf3add_contactTff7b72?.Te6edf3manually_verifiedTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(T79c0ff4T79c0ff2Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72falseTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffimportContactPreservesEncodedVerificationStateTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4)
T8b949e// A contact shared as already verified stays verified on import.
Tff7b72val Te6edf3contact Tff7b72=
Te6edf3SharedContactTb4b4b4(Te6edf3node_num Tff7b72= T79c0ff4T79c0ff2Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!0000002aTa5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTestTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3manually_verified Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72var Te6edf3sentMessageTb4b4b4: Te6edf3AdminMessage? Tff7b72= Tff7b72null
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Te6edf3sentMessage Tff7b72= Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4)Tb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3importContactTb4b4b4(Te6edf3contactTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Tff7b72trueTb4b4b4, Te6edf3sentMessageTff7b72?.Te6edf3add_contactTff7b72?.Te6edf3manually_verifiedTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(T79c0ff4T79c0ff2Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72trueTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetHamModeSendsAdminWithEchoedLoraValuesAndUpdatesUserTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4)
Tff7b72val Te6edf3existingUser Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!0000007bTa5d6ff"Tb4b4b4, Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffOld NameTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffOLDTa5d6ff"Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3mapOfTb4b4b4(T79c0ff1T79c0ff2T79c0ff3 Te6edf3to Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3user Tff7b72= Te6edf3existingUserTb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3localConfigFlow Tb4b4b4} Te6edf3returns
Te6edf3MutableStateFlowTb4b4b4(Te6edf3LocalConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3tx_power Tff7b72= T79c0ff2T79c0ff0Tb4b4b4, Te6edf3override_frequency Tff7b72= T79c0ff9T79c0ff1T79c0ff5.5fTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72var Te6edf3sentMessageTb4b4b4: Te6edf3AdminMessage? Tff7b72= Tff7b72null
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Te6edf3sentMessage Tff7b72= Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4)Tb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3setHamModeTb4b4b4(T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3HamParametersTb4b4b4(Te6edf3call_sign Tff7b72= Ta5d6ff"Ta5d6ffKK7ABCTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffKK7ATa5d6ff"Tb4b4b4)Tb4b4b4, T79c0ff4T79c0ff2Tb4b4b4)
Tff7b72val Te6edf3ham Tff7b72= Te6edf3sentMessageTff7b72?.Te6edf3set_ham_mode
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffKK7ABCTa5d6ff"Tb4b4b4, Te6edf3hamTff7b72?.Te6edf3call_signTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffKK7ATa5d6ff"Tb4b4b4, Te6edf3hamTff7b72?.Te6edf3short_nameTb4b4b4)
T8b949e// Current LoRa values are echoed so a re-send never wipes the node's overrides.
Te6edf3assertEqualsTb4b4b4(T79c0ff2T79c0ff0Tb4b4b4, Te6edf3hamTff7b72?.Te6edf3tx_powerTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff9T79c0ff1T79c0ff5.5fTb4b4b4, Te6edf3hamTff7b72?.Te6edf3frequencyTb4b4b4)
Te6edf3verify Tb4b4b4{
Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(
T79c0ff1T79c0ff2T79c0ff3Tb4b4b4,
Te6edf3existingUserTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffKK7ABCTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffKK7ATa5d6ff"Tb4b4b4, Te6edf3is_licensed Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
T79c0ff0Tb4b4b4,
Tff7b72falseTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetHamModeWithNoCachedLoraConfigSendsProtoDefaultsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3emptyMapTb4b4b4(Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3localConfigFlow Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3LocalConfigTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72var Te6edf3sentMessageTb4b4b4: Te6edf3AdminMessage? Tff7b72= Tff7b72null
Te6edf3everySuspend Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Te6edf3sentMessage Tff7b72= Tb4b4b4(Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4)Tb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3controllerTb4b4b4.Te6edf3setHamModeTb4b4b4(T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3HamParametersTb4b4b4(Te6edf3call_sign Tff7b72= Ta5d6ff"Ta5d6ffKK7ABCTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffKK7ATa5d6ff"Tb4b4b4)Tb4b4b4, T79c0ff4T79c0ff2Tb4b4b4)
Tff7b72val Te6edf3ham Tff7b72= Te6edf3sentMessageTff7b72?.Te6edf3set_ham_mode
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3hamTff7b72?.Te6edf3tx_powerTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0fTb4b4b4, Te6edf3hamTff7b72?.Te6edf3frequencyTb4b4b4)
T8b949e// Unknown node: the optimistic update is built on a default User.
Te6edf3verify Tb4b4b4{
Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(
T79c0ff1T79c0ff2T79c0ff3Tb4b4b4,
Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffKK7ABCTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffKK7ATa5d6ff"Tb4b4b4, Te6edf3is_licensed Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
T79c0ff0Tb4b4b4,
Tff7b72falseTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsetHamModeIgnoresRemoteDestinationsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3setHamModeTb4b4b4(T79c0ff4T79c0ff5T79c0ff6Tb4b4b4, Te6edf3HamParametersTb4b4b4(Te6edf3call_sign Tff7b72= Ta5d6ff"Ta5d6ffKK7ABCTa5d6ff"Tb4b4b4, Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffKK7ATa5d6ff"Tb4b4b4)Tb4b4b4, T79c0ff4T79c0ff2Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedUserTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffimportContactReturnsEarlyWhenDisconnectedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3controller Tff7b72= Te6edf3createControllerTb4b4b4(Te6edf3scope Tff7b72= Te6edf3backgroundScopeTb4b4b4, Te6edf3myNodeNum Tff7b72= Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3contact Tff7b72= Te6edf3SharedContactTb4b4b4(Te6edf3node_num Tff7b72= T79c0ff4T79c0ff2Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!0000002aTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3controllerTb4b4b4.Te6edf3importContactTb4b4b4(Te6edf3contactTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.48s